/*********************
 * 代码名称：aha算法 小猫钓鱼 P41
 * 功能实现：模拟小猫钓鱼
 * 代码提供：tiaya@qq.com
 * 编写时间：年 月 日
 **********************/
#include <iostream>
#include <cstdlib>

using namespace std;

//队列结构体定义
struct quene {
    int head;          //队列的头部
    int tail;          //队列的尾巴
    int data[1001];    //队列的数据区
};

//堆栈暂存区定义
struct stack_desk {
    int data[10];      //暂存区堆栈数据区
    int top;           //堆栈指针；
};

int main() {
    //code here
    int t, book[10];   //t当前出出去的牌，book[]记录桌面上出过的牌，为1表示出过

    struct quene q1, q2;
    struct stack_desk sd;

    //队列选手初始化
    q1.head = 1;
    q1.tail = 1;

    q2.head = 1;
    q2.tail = 1;

    //初始化桌面堆栈
    sd.top = 0;

    for(int i=0; i<10; i++) {
        book[i] = 0;
    }

    //生成选手q1的6张牌
    cout << "请输入选手q1的6张牌：" << endl;
    for(int i = 1; i <= 6; i ++) {
        cin >> q1.data[q1.tail];
        q1.tail ++;
    }

    //生成选手q2的6张牌
    cout << "请输入选手q2的6张牌：" << endl;
    for(int i = 1;i <= 6; i ++) {
        cin >> q2.data[q2.tail];
        q2.tail ++;
    }

    //选手出牌
    while(q1.head < q1.tail && q2.head < q2.tail) {
        //当两个队列不为空时，可以出牌
        //选手q1出牌
        t = q1.data[q1.head];

        if(book[t] == 0) {   //桌面上没有牌
            q1.head ++;      //出牌
            sd.top ++;        //桌面堆栈增加
            sd.data[sd.top] = t;   //存储桌面上的牌
            book[t] = 1;     //牌已经出过
        } else {             //q1可以赢牌
            q1.head ++;      //已经打出去一张牌
            q1.data[q1.tail] = t;  //将赢到的牌增加到队列
            q1.tail ++;      //队尾增加
            //把桌面上的牌都依次赢走
            while(sd.data[sd.top] != t) {
                book[sd.data[sd.top]] = 0;  //取消标记
                q1.data[q1.tail] = sd.data[sd.top];
                q1.tail ++;    //
                sd.top --;      //
            }
        }

        t = q2.data[q2.head];

        if(book[t] == 0) {   //桌面上没有牌
            q2.head ++;      //出牌
            sd.top ++;        //桌面堆栈增加
            sd.data[sd.top] = t;   //存储桌面上的牌
            book[t] = 1;     //牌已经出过
        } else {             //q1可以赢牌
            q2.head ++;      //已经打出去一张牌
            q2.data[q1.tail] = t;  //将赢到的牌增加到队列
            q2.tail ++;      //队尾增加
            //把桌面上的牌都依次赢走
            while(sd.data[sd.top] != t) {
                book[sd.data[sd.top]] = 0;  //取消标记
                q2.data[q2.tail] = sd.data[sd.top];
                q2.tail ++;    //
                sd.top --;      //
            }
        }

    }

    //游戏结束 队列为空
    if(q2.head == q2.tail) {
        cout << "q2赢了" << endl;
        cout << "q2手中的牌是：" ;
        for(int i = q1.head; i < q1.tail; i ++) {
            cout << q1.data[i] << " ";
        }

        if(sd.top > 0) {
            cout << "桌面上的牌是：";
            for(int i = 1; i < sd.top + 1; i++) {
                cout << sd.data[i] << " ";
            }
        } else {
            cout << "桌面上已经没有牌了" << endl;
        }

    } else {
        cout << "q1赢了" << endl;
        cout << "q1手中的牌是：" ;
        for(int i = q2.head; i < q2.tail; i ++) {
            cout << q2.data[i] << " ";
        }

        if(sd.top > 0) {
            cout << "桌面上的牌是：";
            for(int i = 1; i < sd.top + 1; i++) {
                cout << sd.data[i] << " ";
            }
        } else {
            cout << "桌面上已经没有牌了" << endl;
        }
    }

    getchar(); getchar();
    //system("pause");

    return 0;
}

/************************
请输入选手q1的6张牌：
2 4 1 2 5 6
请输入选手q2的6张牌：
3 1 3 5 6 4
q2赢了
q2手中的牌是：5 6 2 0 1 4 6 5 桌面上的牌是：2134
************************/
